package com.example.design;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理模式，代码演示
 * @author xiaohf
 * @createTime 2021/9/27 21:09
 **/
public class CglibProxy {
    public static void main(String[] args) {
        //cglib增强器
        Enhancer enhancer=new Enhancer();
        //设置要代理的类，通过父类继承的方式实现
        enhancer.setSuperclass(CglibSubject.class);
        //设置代理类
        enhancer.setCallback(new CglibClassInterceptor());
        //创建代理对象
        CglibSubject cglibSubject=(CglibSubject)enhancer.create();
        //调用方法，这里已经是代理类了 com.example.design.CglibSubject$$EnhancerByCGLIB$$64facd51@27c20538
        cglibSubject.request();
    }


}


class CglibSubject {

    public void request() {
        System.out.println("处理请求");
    }

}

class CglibClassInterceptor implements MethodInterceptor{

    @Override
    public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println(method.getName()+"方法执行前");
        Object result;
        //这个代码执行的是代理对象的代理方法，会导致stackoverflowError
//        result = methodProxy.invoke(object, args);
        //执行代理类（object）的父类（被代理的对象）的方法
        result = methodProxy.invokeSuper(object, args);
        System.out.println(method.getName()+"方法执行后");
        return result;
    }
}


